// @include "../extend/Debug.js"
/**
 * @fileOverview 事件通知扩展工具
 * 
 * @version qinglan_listener 1.0
 * @static
 * @author wxq wxqqh@qq.com
 */
/**
 * 命名空间
 * 
 * @namespace
 * @type Object
 */
window.qinglan = window.qinglan || {};
/**
 * 事件通知类，在对象内部把事件抛出
 * 
 * @param {Srting}
 *            name 本事件实例名字(ID)
 * @param {Object}
 *            target 事件触发对象
 */
qinglan.Listener = function(name, target) {
	this.name = name ? name : qinglan.Listener.index++;
	this.target = target;
	this.advicePool = {};
	
	qinglan.Listener._pool[name] = this;
};
/**
 * 监听器索引
 * 
 * @type Number
 */
qinglan.Listener._index = 0; 
/**
 * 所有事件对象缓存索引
 * 
 * @type Object
 */
qinglan.Listener._pool = {};
/**
 * 根据名字得到事件对象实例
 * 
 * @param {String}
 *            name 实例名字
 * @return {qinglan.Listener} 事件对象实例
 */
qinglan.Listener.getListenerByName = function(name) {
	return qinglan.Listener._pool[name];
};
/**
 * 增加监听的函数
 * 
 * @param {String}
 *            type 事件类型
 * @param {String}
 *            name 监听器名字
 * @param {Function}
 *            advice 监听器
 */
qinglan.Listener.prototype.addAdvice = function(type, name, advice) {
	!this.advicePool[type] && (this.advicePool[type] = []);
	var event = function() {
		advice.apply(this.target || window, arguments);
	};
	this.advicePool[type][name] = event;
};
/**
 * 删除监听函数
 * 
 * @param {String}
 *            type 事件类型
 * @param {String}
 *            name 监听器名字
 */
qinglan.Listener.prototype.removeAdvice = function(type, name) {
	try {
		delete this.advicePool[type][name];
	} catch (e) {
		qinglan.Debug.error('Delete Advice : [' + advice + '] from Listener : [' + this + '] error !');
	}
};
/**
 * 通知所有制定类型的监听器
 * 
 * @param {String}
 *            type 事件类型
 * @param {Array}
 *            args 参数数组
 */
qinglan.Listener.prototype.notify = function(type, args) {
	if (this.advicePool[type]) {
		for (var name in this.advicePool[type]) {
			this.advicePool[type][name].apply(this, args);
		}
	}
};
